#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Project    : AutomatedTesting
# @Name       : task_scheduler.py
# @IDE        : PyCharm
# @Author     : OneYoung
# @Created    : 2025/8/25 10:36
# @Desc       : 执行定时任务，并通过接口返回任务列表

import time
import uvicorn
from fastapi import FastAPI
from datetime import datetime
from utils.scheduler import Scheduler
from contextlib import asynccontextmanager

# 定时任务调度器
scheduler = Scheduler()


# 待测任务示例
def task_test(name=None):
    print(f"定时任务执行测试-{name}：", time.strftime("%Y-%m-%d %H:%M:%S"))


# 启动定时任务
def start_task():
    # 立即执行
    scheduler.run_job_immediately(
        func=task_test,
        args=['立即执行']
    )
    # 定时日期
    scheduler.add_date_job(
        func=task_test,
        run_date=datetime.now().replace(minute=datetime.now().minute + 1),
        args=['定时日期执行']
    )
    # Cron任务
    scheduler.add_cron_job(
        func=task_test,
        cron_expr={"second": "30"},
        args=['Cron执行']
    )
    # 间隔时间
    scheduler.add_interval_job(
        func=task_test,
        interval={"seconds": 10},
        args=['间隔时间执行']
    )


# 程序运行启动调度器，退出关闭调度器
@asynccontextmanager
async def lifespan(p: FastAPI):
    start_task()
    print("启动定时任务成功...")
    yield
    scheduler.shutdown()
    print("关闭定时任务成功...")


# 添加接口，用于查看定时任务列表
app = FastAPI(lifespan=lifespan)


@app.get("/jobs", summary="获取定时任务列表")
async def get_job_list():
    """
    访问 http://127.0.0.1:8001/jobs 接口，可查询执行中的定时任务列表
    """
    return [scheduler.get_job_info(job.id) for job in scheduler.scheduler.get_jobs()]


if __name__ == '__main__':
    uvicorn.run(app, host="0.0.0.0", port=8001)
